package com.xiaomaoguai.spring.aop;

import java.util.Random;

/**
 * @fileName: Math.java
 * @author: WeiHui.Zhang
 * @date: 2016-11-10  9:51
 * @version: v1.0.0
 */
public class Math2 {

	//加
	public int add(int n1, int n2) {
		//开始时间
		long start = System.currentTimeMillis();
		lazy();
		int result = n1 + n2;
		System.out.println(n1 + "+" + n2 + "=" + result);
		Long span = System.currentTimeMillis() - start;
		System.out.println("共用时：" + span);
		return result;
	}

	//减
	public int sub(int n1, int n2) {
		//开始时间
		long start = System.currentTimeMillis();
		lazy();
		int result = n1 - n2;
		System.out.println(n1 + "-" + n2 + "=" + result);
		Long span = System.currentTimeMillis() - start;
		System.out.println("共用时：" + span);
		return result;
	}

	//乘
	public int mut(int n1, int n2) {
		//开始时间
		long start = System.currentTimeMillis();
		lazy();
		int result = n1 * n2;
		System.out.println(n1 + "X" + n2 + "=" + result);
		Long span = System.currentTimeMillis() - start;
		System.out.println("共用时：" + span);
		return result;
	}

	//除
	public int div(int n1, int n2) {
		//开始时间
		long start = System.currentTimeMillis();
		lazy();
		int result = n1 / n2;
		System.out.println(n1 + "/" + n2 + "=" + result);
		Long span = System.currentTimeMillis() - start;
		System.out.println("共用时：" + span);
		return result;
	}

	//模拟延时
	public void lazy() {
		try {
			int n = new Random().nextInt(500);
			Thread.sleep(n);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Math2 math = new Math2();
		int n1 = 100, n2 = 5;
		math.add(n1, n2);
		math.sub(n1, n2);
		math.mut(n1, n2);
		math.div(n1, n2);
	}
}
//缺点：
//
//		1、工作量特别大，如果项目中有多个类，多个方法，则要修改多次。
//
//		2、违背了设计原则：开闭原则（OCP），对扩展开放，对修改关闭，而为了增加功能把每个方法都修改了，也不便于维护。
//
//		3、违背了设计原则：单一职责（SRP），每个方法除了要完成自己本身的功能，还要计算耗时、延时；每一个方法引起它变化的原因就有多种。
//
//		4、违背了设计原则：依赖倒转（DIP），抽象不应该依赖细节，两者都应该依赖抽象。而在Test类中，Test与Math都是细节。
//
//		使用静态代理可以解决部分问题。
